package leetcode_day._2022._202201._0110;

/**
 * @author yzh
 * @version 1.0
 * @date 2022/2/22 21:53
 * 消除游戏
 * 列表 arr 由在范围 [1, n] 中的所有整数组成，并按严格递增排序。请你对 arr 应用下述算法：
 *
 * 从左到右，删除第一个数字，然后每隔一个数字删除一个，直到到达列表末尾。
 * 重复上面的步骤，但这次是从右到左。也就是，删除最右侧的数字，然后剩下的数字每隔一个删除一个。
 * 不断重复这两步，从左到右和从右到左交替进行，直到只剩下一个数字。
 * 算法：数学
 * f(n) 为从左到右开始删除，b(n) 为从右到左开始删除
 * n = 1, f(n) = 1, b(n) = 1;
 * f(n) + b(n) = n + 1;
 * f(n) = 2 * b(n / 2) = 2 * (n / 2 + 1 - f(n / 2))
 */
public class _02_390 {

    public int lastRemaining(int n) {
        return n == 1 ? 1 : 2 * (n / 2 + 1 - lastRemaining(n / 2));
    }

}
